package org.xmap.ui.control;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import org.xmap.app.Env;
import org.xmap.ui.base.Event;
import org.xmap.ui.base.Window;

/**
 * <p>位图控件，用于显示位图。</p>
 * @author Zealot
 * @version 1.0
 */
public final class Bitmap extends Window {

    /**
     * 边框的颜色。
     */
    private int lineColor;
    /**
     * 是否绘制边框。
     */
    private boolean drawRect;
    /**
     * 是否是透明，如果透明，将不会显示背景颜色。
     */
    private boolean transparent;

    /**
     * 指定图像、位图的锚点坐标、位图宽高和锚点类型的构造函数。
     * @param image Image 图像。
     * @param leftUpX int 位图的锚点的横坐标。
     * @param leftUpY int 位图的锚点的纵坐标。
     * @param width int 位图的宽度。
     * @param height int 位图的高度。
     * @param orient int 锚点的类型。
     */
    public Bitmap(Image image, int leftUpX, int leftUpY, int width, int height, int orient) {
        super(leftUpX, leftUpY, width, height, orient);
        this.setImage(image);
    }

    /**
     * 指定图像路径、位图的锚点坐标、位图宽高和锚点类型的构造函数。
     * @param url String 图像路径。
     * @param leftUpX int 位图的锚点的横坐标。
     * @param leftUpY int 位图的锚点的纵坐标。
     * @param width int 位图的宽度。
     * @param height int 位图的高度。
     * @param orient int 锚点的类型。
     */
    public Bitmap(String url, int leftUpX, int leftUpY, int width, int height, int orient) {
        super(leftUpX, leftUpY, width, height, orient);
        try {
            Image i = Image.createImage(url);
            this.setImage(i);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 指定新的图像。
     * @param image Image 新的图像。
     */
    public void setImage(Image image) {
        this.setBgImage(image);
    }

    /**
     * 获得当前图像。
     * @return Image 当前图像。
     */
    public Image getImage() {
        return this.getBgImage();
    }

    /**
     * 设置边框的颜色。
     * @param lineColor int 边框的颜色。
     */
    public void setLineColor(int lineColor) {
        this.lineColor = lineColor;
    }

    /**
     * 获得边框的颜色。
     * @return int 边框的颜色。
     */
    public int getLineColor() {
        return this.lineColor;
    }

    /**
     * 设置是否显示边框。
     * @param isDrawRect boolean 是否显示边框。
     */
    public void setDrawRect(boolean isDrawRect) {
        this.drawRect = isDrawRect;
    }

    /**
     * 获得是否显示边框。
     * @return boolean 是否显示边框。
     */
    public boolean getDrawRect() {
        return this.drawRect;
    }

    /**
     * 设置当前位图是否为透明，透明的意思是不用背景颜色填充背景。
     * @param transparent boolean 是否透明。
     */
    public void setTransparent(boolean transparent) {
        this.transparent = transparent;
    }

    /**
     * 获得当前位图是否为透明。
     * @return boolean 是否透明。
     */
    public boolean getTransparent() {
        return this.transparent;
    }

    /**
     * 绘制函数。
     * @param g Graphics 图形句柄。
     */
    public void draw(Graphics g) {
        g.setFont(Env.instance.defaultFont);
        if (!this.transparent) {
            g.setColor(this.bgColor);
            g.fillRect(0, 0, this.getRect().width, this.getRect().height);
        }
        if (this.bgImage != null) {
            if (super.getBackgroundImageStretch() | super.getBackgroundImageCenter()) {
                g.drawImage(this.bgImage, this.getRect().width >> 1, this.getRect().height >> 1, Graphics.VCENTER | Graphics.HCENTER);
            } else {
                for (int i = 0; i < this.getRect().width; i += this.bgImage.getWidth()) {
                    for (int j = 0; j < this.getRect().height; j += this.bgImage.getHeight()) {
                        g.drawImage(this.bgImage, i, j, Graphics.LEFT | Graphics.TOP);
                    }
                }
            }
        }
        if (this.drawRect) {
            g.setColor(this.lineColor);
            g.drawRect(0, 0, this.getRect().width - 1, this.getRect().height - 1);
        }
    }

    /**
     * Bitmap控件不处理任何按键消息
     * @param flag boolean 是按下还是抬起。
     * @param keyCode int 按键代码。
     * @param gameAction int 动作代码。
     * @return boolean 是否处理该事件。
     */
    public boolean keyEvent(boolean flag, int keyCode, int gameAction) {
        return false;
    }

    /**
     * 触笔事件处理函数，在Label区域内的触笔事件都被处理。
     * @param ev Event 触笔事件。
     * @return boolean 是否处理该事件。
     */
    public boolean pointerEvent(Event ev) {
        if (this.getRect().collideWith(ev.param1, ev.param2)) {
            return true;
        }
        return false;
    }
}
